IsConvertibleT是一个类型特征(type trait), 用于判断一个类型是否可以转换为另一个类型。这是模板元编程中非常实用的工具。

// ===================================
// IsConvertibleT的基本概念
// ===================================
IsConvertibleT<FROM, TO>用于检测类型FROM是否可以隐式或显式转换为类型TO。如果可以转换, 则IsConvertibleT<FROM, TO>::value为true, 否则为false。



// 实现原理
// IsConvertibleT的实现通常基于以下几个关键技术: 
1.SFINAE原则(Substitution Failure Is Not An Error)
2.类型转换测试
3.辅助模板和特化

// 典型实现方式
// 主模板声明
template<typename FROM, typename TO>
class IsConvertibleT {
private:
    // 测试函数 - 接受TO类型参数
    static void aux(TO);
    
    // 使用decltype和sizeof技巧检测转换可行性
    template<typename F, typename = std::void_t<decltype(aux(std::declval<F>()))>>
    static std::true_type test(void*);
    
    // 回退选项
    template<typename>
    static std::false_type test(...);

public:
    // 最终结果
    static constexpr bool value = decltype(test<FROM>(nullptr))::value;
};
// 实现细节解析
1.辅助函数aux(): 
    这个函数只声明不定义, 它接受一个TO类型的参数
    目的是测试FROM类型是否可以作为TO类型的参数传递
2.测试函数test(): 
    第一个重载使用SFINAE原则, 如果FROM可以转换为TO, 则选择这个版本
    使用std::declval<F>()创建一个FROM类型的临时值
    如果转换成功, 返回std::true_type
3.回退函数: 
    如果第一个测试函数由于SFINAE而失败, 则选择这个版本
    返回std::false_type 
4.value常量: 
    通过调用适当的test()函数并获取其返回类型的value成员来确定最终结果


